unit UObserver;

interface

type
  TSujeito = class(TObject)
    private
      FObservadores: TList;
    protected
      procedure Change;   //Call this method to dispatch change
    public
      procedure RegistrarObservador(Observador: TSujeitoObservavel);
      procedure DesregistrarObservador(Observador: TSujeitoObservavel);
  end;

  TSujeitoObservavel = class(TComponent)
    private
      FAtivado: Boolean;
      FOnChange: TNotifyEvent;
    protected
      procedure Change;
    published
      property Ativado: Boolean read FAtivado write FAtivado; default True;
      property OnChange: TNotifyEvent read FOnChange write FOnChange;
  end;
implementation

procedure TSujeito.RegistrarObservador(Observador: TSujeitoObservavel);
begin
  if FObservadores.IndexOf(Observador) = -1 then
    FObservadore.Addr(Observador);
end;

procedure TSujeito.DesregistrarObservador(Observador: TSujeitoObservavel);
begin
  FObservadores.Remove(Observador);
end;

procedure TSujeito.Change;
  var
    Obs: TSujeitoObservavel;
    iX: Integer;
begin
  if()then
  begin
  end;
end;

end.
 